home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / biz / dopus / DOpus414JRsrc.lha / DirectoryOpus4 / Library / filereq.c < prev    next >
C/C++ Source or Header  |  2000-03-10  |  36KB  |  1,025 lines

  1. /*
  2.  
  3. Directory Opus 4
  4. Original GPL release version 4.12
  5. Copyright 1993-2000 Jonathan Potter
  6.  
  7. This program is free software; you can redistribute it and/or
  8. modify it under the terms of the GNU General Public License
  9. as published by the Free Software Foundation; either version 2
  10. of the License, or (at your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  20.  
  21. All users of Directory Opus 4 (including versions distributed
  22. under the GPL) are entitled to upgrade to the latest version of
  23. Directory Opus version 5 at a reduced price. Please see
  24. http://www.gpsoft.com.au for more information.
  25.  
  26. The release of Directory Opus 4 under the GPL in NO WAY affects
  27. the existing commercial status of Directory Opus 5.
  28.  
  29. */
  30.  
  31. #include "dopuslib.h"
  32. #include <dopus/filereq.h>
  33.  
  34. void close_req(struct FileReqData *freqdata);
  35. void deallocate_entries(struct FileReqData *freqdata);
  36. void clearfiles(struct FileReqData *freqdata);
  37. void doprops(struct FileReqData *freqdata);
  38. void fixprop(struct FileReqData *freqdata);
  39. void checkdrawer(char *buf);
  40. void refreshdrawergad(struct FileReqData *freqdata);
  41. void activatestrgad(struct Window *win,struct Gadget *gad);
  42. void activatefilegad(struct FileReqData *freqdata);
  43. struct direntry *getfileentry(struct FileReqData *freqdata,int which);
  44. void freemulti(struct DOpusFileReq *freq);
  45.  
  46. static struct PropInfo
  47.     defaultprop={PROPBORDERLESS|FREEVERT,0,0,0,0xffff};
  48. static struct Image
  49.     defaultimage={0,0,8,22,1,NULL,0,1,NULL};
  50.  
  51. static struct IntuiText
  52.     defaulttext[6]={
  53.         {1,0,JAM1,0,0,NULL,(UBYTE *)"File",NULL},
  54.         {1,0,JAM1,0,0,NULL,(UBYTE *)"Drawer",NULL},
  55.         {1,0,JAM1,0,2,NULL,(UBYTE *)"Accept",NULL},
  56.         {1,0,JAM1,0,2,NULL,(UBYTE *)"Cancel",NULL},
  57.         {1,0,JAM1,0,2,NULL,(UBYTE *)"Parent",NULL},
  58.         {1,0,JAM1,0,2,NULL,(UBYTE *)"Drives",NULL}};
  59.  
  60. static struct Gadget
  61.     defaultgadgets[9]={
  62.         {NULL,64,47,240,8,GADGHCOMP,RELVERIFY|TOGGLESELECT,STRGADGET,
  63.             NULL,NULL,NULL,NULL,NULL,FILENAME,NULL},
  64.         {NULL,64,34,240,8,GADGHCOMP,RELVERIFY|TOGGLESELECT,STRGADGET,
  65.             NULL,NULL,NULL,NULL,NULL,DRAWERNAME,NULL},
  66.         {NULL,8,59,132,12,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
  67.             NULL,NULL,NULL,OKAY,NULL},
  68.         {NULL,176,59,132,12,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
  69.             NULL,NULL,NULL,CANCEL,NULL},
  70.         {NULL,292,14,16,8,GADGHCOMP,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,
  71.             NULL,NULL,NULL,NULL,NULL,FILENAMEUP,NULL},
  72.         {NULL,292,22,16,8,GADGHCOMP,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,
  73.             NULL,NULL,NULL,NULL,NULL,FILENAMEDOWN,NULL},
  74.         {NULL,8,14,132,12,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
  75.             NULL,NULL,NULL,PARENT,NULL},
  76.         {NULL,176,14,132,12,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
  77.             NULL,NULL,NULL,DRIVES,NULL},
  78.         {NULL,296,30,8,22,GADGHNONE,GADGIMMEDIATE|FOLLOWMOUSE|RELVERIFY,PROPGADGET,
  79.             NULL,NULL,NULL,NULL,NULL,FILENAMEPOS,NULL}};
  80.  
  81. static struct NewWindow defaultwindow={
  82.     15,25,316,115,0,1,IDCMP_GADGETUP|IDCMP_GADGETDOWN|IDCMP_MOUSEMOVE|IDCMP_MOUSEBUTTONS,
  83.     WFLG_SMART_REFRESH|WFLG_NOCAREREFRESH|WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_DRAGBAR,
  84.     NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN};
  85.  
  86. extern char nullstring[];
  87.  
  88. __saveds DoFileRequest(register struct DOpusFileReq *freq __asm("a0"))
  89. {
  90.     struct Library *AslBase;
  91.  
  92.     if (freq->dirbuf[0] && (CheckExist(freq->dirbuf,NULL)<0)) {
  93.         char *ptr;
  94.         if (ptr=BaseName(freq->dirbuf)) {
  95.             if (freq->filebuf) {
  96.                 int a;
  97.  
  98.                 LStrnCpy(freq->filebuf,ptr,FILEBUF_SIZE-2);
  99.                 a=strlen(freq->filebuf);
  100.                 if (freq->filebuf[a-1]=='/') freq->filebuf[a-1]=0;
  101.             }
  102.             *ptr=0;
  103.         }
  104.     }
  105.  
  106.     if ((AslBase=OpenLibrary("asl.library",0))) {
  107.         struct TagItem asltags[10];
  108.         struct FileRequester *fr;
  109.         int font,res,a;
  110.         char initialfont[40],*ptr;
  111.         APTR request;
  112.  
  113.         for (a=0;a<10;a++) {
  114.             asltags[a].ti_Tag=TAG_SKIP;
  115.             asltags[a].ti_Data=0;
  116.         }
  117.         asltags[9].ti_Tag=TAG_END;
  118.  
  119.         if (freq->flags&DFRF_FONT) font=1;
  120.         else font=0;
  121.  
  122.         if (freq->title) {
  123.             asltags[0].ti_Tag=ASL_Hail;
  124.             asltags[0].ti_Data=(ULONG)freq->title;
  125.         }
  126.  
  127.         asltags[1].ti_Tag=ASL_Window;
  128.         asltags[1].ti_Data=(ULONG)((freq->window)?freq->window:IntuitionBase->ActiveWindow);
  129.  
  130.         if (freq->x>0) {
  131.             asltags[2].ti_Tag=ASL_LeftEdge;
  132.             asltags[2].ti_Data=freq->x;
  133.         }
  134.  
  135.         if (freq->y>0) {
  136.             asltags[3].ti_Tag=ASL_TopEdge;
  137.             asltags[3].ti_Data=freq->y;
  138.         }
  139.  
  140.         asltags[4].ti_Tag=ASL_Height;
  141.         asltags[4].ti_Data=freq->lines*14;
  142.  
  143.         if (font) {
  144.             if (ptr=BaseName(freq->dirbuf)) {
  145.                 strcpy(initialfont,ptr);
  146.                 a=strlen(initialfont);
  147.                 if (initialfont[a-1]=='/') initialfont[a-1]=0;
  148.             }
  149.             else initialfont[0]=0;
  150.             asltags[5].ti_Tag=ASLFO_InitialName;
  151.             asltags[5].ti_Data=(ULONG)initialfont;
  152.             asltags[6].ti_Tag=ASLFO_InitialSize;
  153.             asltags[6].ti_Data=atoi(freq->filebuf);
  154.         }
  155.         else {
  156.             if (freq->filebuf) {
  157.                 asltags[5].ti_Tag=ASL_File;
  158.                 asltags[5].ti_Data=(ULONG)freq->filebuf;
  159.             }
  160.             if (freq->dirbuf) {
  161.                 asltags[6].ti_Tag=ASL_Dir;
  162.                 asltags[6].ti_Data=(ULONG)freq->dirbuf;
  163.             }
  164.         }
  165.  
  166.         asltags[7].ti_Tag=ASL_FuncFlags;
  167.  
  168.         if (font) asltags[7].ti_Data=FONF_NEWIDCMP;
  169.         else {
  170.             if (freq->flags&DFRF_SAVE) asltags[7].ti_Data=FILF_SAVE|FILF_NEWIDCMP;
  171.             else if (freq->flags&DFRF_MULTI) asltags[7].ti_Data=FILF_MULTISELECT|FILF_NEWIDCMP;
  172.             else asltags[7].ti_Data=FILF_NEWIDCMP;
  173.  
  174.             if (freq->flags&DFRF_DIRREQ) {
  175.                 asltags[8].ti_Tag=ASL_ExtFlags1;
  176.                 asltags[8].ti_Data|=FIL1F_NOFILES;
  177.             }
  178.         }
  179.  
  180.         if (request=AllocAslRequest((font)?ASL_FontRequest:ASL_FileRequest,asltags)) {
  181.             if (res=AslRequest(request,NULL)) {
  182.                 if (font) {
  183.                     if (freq->dirbuf) {
  184.                         StrCombine(freq->dirbuf,"FONTS:",((struct FontRequester *)request)->fo_Attr.ta_Name,256);
  185.                         strcat(freq->dirbuf,"/");
  186.                     }
  187.                     if (freq->filebuf) {
  188.                         LSprintf(freq->filebuf,"%ld",((struct FontRequester *)request)->fo_Attr.ta_YSize);
  189.                     }
  190.                 }
  191.                 else {
  192.                     fr=(struct FileRequester *)request;
  193.                     if (freq->dirbuf) strcpy(freq->dirbuf,fr->fr_Drawer);
  194.                     if (!(freq->flags&DFRF_DIRREQ)) {
  195.                         if (freq->filebuf) strcpy(freq->filebuf,fr->fr_File);
  196.                     }
  197.                     if (freq->flags&DFRF_MULTI && fr->fr_NumArgs>0) {
  198.                         if ((freq->filearray=
  199.                             LAllocRemember(&freq->filearraykey,(fr->fr_NumArgs+1)*4,MEMF_CLEAR))) {
  200.                             for (a=0;a<fr->fr_NumArgs;a++) {
  201.                                 if (freq->filearray[a]=LAllocRemember(&freq->filearraykey,
  202.                                     strlen(fr->fr_ArgList[a].wa_Name)+1,MEMF_CLEAR)) {
  203.                                     strcpy(freq->filearray[a],fr->fr_ArgList[a].wa_Name);
  204.                                 }
  205.                             }
  206.                         }
  207.                     }
  208.                 }
  209.             }
  210.             FreeAslRequest(request);
  211.         }
  212.         CloseLibrary(AslBase);
  213.         return(res);
  214.     }
  215.     else {
  216.         ULONG class;
  217.         USHORT code,gadgetid,qual;
  218.         struct FileReqData *freqdata;
  219.         unsigned char *dirbuf;
  220.         int i,ret=1;
  221.  
  222.         if (!(freqdata=AllocMem(sizeof(struct FileReqData),MEMF_CLEAR)))
  223.             return(ERROR_NOMEM);
  224.         freqdata->freq=freq;
  225.         if (!(initrequester(freqdata))) {
  226.             close_req(freqdata);
  227.             return(ERROR_NOMEM);
  228.         }
  229.         dirbuf=freq->dirbuf;
  230.  
  231.         if ((i=get_filenames(freqdata))==CANCEL) {
  232.             close_req(freqdata);
  233.             freemulti(freq);
  234.             return(ERROR_CANCEL);
  235.         }
  236.         if (i!=OKAY) {
  237.             FOREVER {
  238.                 Wait(1<<freqdata->fr_Window->UserPort->mp_SigBit);
  239.                 while (getintuimsg(freqdata->fr_Window,&class,&code,&qual,&gadgetid)) {
  240.                     if ((i=do_idcmp(freqdata,class,code,qual,gadgetid))==CANCEL) {
  241.                         close_req(freqdata);
  242.                         freemulti(freq);
  243.                         return(ERROR_CANCEL);
  244.                     }
  245.                     if (i==OKAY) {
  246.                         close_req(freqdata);
  247.                         goto acceptreq;
  248.                     }
  249.                 }
  250.             }
  251.         }
  252.         else close_req(freqdata);
  253. acceptreq:
  254.         checkdrawer(dirbuf);
  255.         if (freq->flags&DFRF_DIRREQ) {
  256.             if (i==OKAY || dirbuf[0]) ret=1;
  257.             else ret=0;
  258.         }
  259.         return(ret);
  260.     }
  261. }
  262.  
  263. void close_req(freqdata)
  264. struct FileReqData *freqdata;
  265. {
  266.     struct direntry *file;
  267.     struct DOpusFileReq *freq;
  268.     char *buf;
  269.     int b;
  270.  
  271.     if (freqdata) {
  272.         freq=freqdata->freq;
  273.         if (freqdata->fr_Window) {
  274.             freqdata->freq->x=freqdata->fr_Window->LeftEdge;
  275.             freqdata->freq->y=freqdata->fr_Window->TopEdge;
  276.             CloseWindow(freqdata->fr_Window);
  277.         }
  278.         if (freqdata->flags&DFRF_MULTI && (file=freqdata->firstfile)) {
  279.             b=1;
  280.             while (file) {
  281.                 if (file->select) ++b;
  282.                 file=file->next;
  283.             }
  284.             if (freq->filearray=(char **)DoAllocRemember(&freq->filearraykey,sizeof(char *)*b,MEMF_CLEAR)) {
  285.                 if (buf=(char *)DoAllocRemember(&freq->filearraykey,b*FILEBUF_SIZE/*32*/,MEMF_CLEAR)) {
  286.                     file=freqdata->firstfile; b=0;
  287.                     while (file) {
  288.                         if (file->select) {
  289.                             freq->filearray[b]=&buf[b*FILEBUF_SIZE/*32*/];
  290.                             strcpy(freq->filearray[b],file->name);
  291.                             ++b;
  292.                         }
  293.                         file=file->next;
  294.                     }
  295.                     freq->filearray[b]=&buf[b*FILEBUF_SIZE/*32*/];
  296.                     freq->filearray[b][0]=0;
  297.                 }
  298.                 else freemulti(freq);
  299.             }
  300.         }
  301.         deallocate_entries(freqdata);
  302.         if (freqdata->filetype)
  303.             FreeMem(freqdata->filetype,sizeof(int)*freqdata->freq->lines);
  304.         if (freqdata->finfo) FreeMem(freqdata->finfo,sizeof(struct FileInfoBlock));
  305.         FreeMem(freqdata,sizeof(struct FileReqData));
  306.     }
  307. }
  308.  
  309. displayfiles(freqdata)
  310. struct FileReqData *freqdata;
  311. {
  312.     struct direntry *work;
  313.     struct RastPort *rp;
  314.     int a,b,y,nlim,slim;
  315.  
  316.     if (freqdata->fileoffset==freqdata->oldfileoffset) return(0);
  317.     freqdata->oldfileoffset=freqdata->fileoffset;
  318.     if ((work=freqdata->firstfile)) {
  319.         for (a=0;a<freqdata->fileoffset;a++)
  320.             if (!(work=work->next)) break;
  321.     }
  322.     rp=freqdata->fr_Window->RPort;
  323.  
  324.     y=freqdata->fy+freqdata->fb;
  325.     nlim=freqdata->width-7; slim=7;
  326.     if (nlim<8) {
  327.         nlim=8;
  328.         slim=freqdata->width-8;
  329.     }
  330.     if (nlim>freqdata->width) {
  331.         nlim=freqdata->width;
  332.         slim=0;
  333.     }
  334.     SetDrMd(rp,JAM2);
  335.     for (b=0;b<freqdata->freq->lines;b++) {
  336.         Move(rp,10,y);
  337.         if (work) {
  338.             freqdata->filetype[b]=work->type;
  339.             if (work->type<0) {
  340.                 if (work->select) {
  341.                     SetAPen(rp,2);
  342.                     SetBPen(rp,3);
  343.                 }
  344.                 else SetAPen(rp,1);
  345.             }
  346.             else if (work->type>0) SetAPen(rp,3);
  347.             else SetAPen(rp,2);
  348.             a=strlen(work->name); if (a>nlim) a=nlim;
  349.             Text(rp,work->name,a);
  350.             if (a<nlim) Text(rp,nullstring,nlim-a);
  351.             if (slim) Text(rp,work->size,slim);
  352.             if (work->select) SetBPen(rp,0);
  353.             work=work->next;
  354.         }
  355.         else Text(rp,nullstring,freqdata->width);
  356.         y+=freqdata->fh;
  357.     }
  358. }
  359.  
  360. void deallocate_entries(freqdata)
  361. struct FileReqData *freqdata;
  362. {
  363.     DoFreeRemember(&freqdata->filekey);
  364.     freqdata->firstfile=freqdata->firstdir=NULL;
  365.     freqdata->fileentries=freqdata->fileoffset=0; freqdata->oldfileoffset=-1;
  366. }
  367.  
  368. void doposprop(freqdata)
  369. struct FileReqData *freqdata;
  370. {
  371.     freqdata->fileoffset=DoGetSliderPos(&freqdata->reqgads[8],freqdata->fileentries,freqdata->freq->lines);
  372.     displayfiles(freqdata);
  373. }
  374.  
  375. get_filenames(freqdata)
  376. struct FileReqData *freqdata;
  377. {
  378.     BPTR lock;
  379.     ULONG class;
  380.     USHORT code,qual,gadgetid;
  381.     int ret=0;
  382.     char buf[33];
  383.  
  384.     freqdata->firstfile=freqdata->firstdir=NULL;
  385.  
  386.     if (!(lock=Lock(freqdata->freq->dirbuf,ACCESS_READ))) {
  387.         freqdata->oldfileoffset=-1; freqdata->fileentries=0;
  388.         fixprop(freqdata);
  389.         displayfiles(freqdata);
  390.         return(0);
  391.     }
  392.  
  393.     Examine(lock,freqdata->finfo);
  394.     if (freqdata->finfo->fib_DirEntryType<0) {
  395.         UnLock(lock);
  396.         freqdata->oldfileoffset=-1;
  397.         displayfiles(freqdata);
  398.         return(0);
  399.     }
  400.  
  401.     while (ExNext(lock,freqdata->finfo)) {
  402.         while (getintuimsg(freqdata->fr_Window,&class,&code,&qual,&gadgetid)) {
  403.             ret=gettingdirmsg(freqdata,class,code,qual,gadgetid);
  404.             if (ret==OKAY || ret==CANCEL || ret==INTERRUPT) {
  405.                 if (lock) UnLock(lock);
  406.                 return(ret);
  407.             }
  408.         }
  409.         if (freqdata->finfo->fib_DirEntryType<0) {
  410.             if (freqdata->flags&DFRF_FONT) {
  411.                 LSprintf(buf,"%ld",atoi(freqdata->finfo->fib_FileName));
  412.                 if (strcmp(buf,freqdata->finfo->fib_FileName)) continue;
  413.             }
  414.             else if (freqdata->flags&DFRF_DIRREQ) continue;
  415.         }
  416.         addfileentry(freqdata,freqdata->finfo->fib_FileName,
  417.             freqdata->finfo->fib_DirEntryType,freqdata->finfo->fib_Size);
  418.         freqdata->oldfileoffset=-1;
  419.         fixprop(freqdata);
  420.         doposprop(freqdata);
  421.     }
  422.     if (lock) UnLock(lock);
  423.     freqdata->oldfileoffset=-1;
  424.     displayfiles(freqdata);
  425.     return(ret);
  426. }
  427.  
  428. getnewdrawer(freqdata)
  429. struct FileReqData *freqdata;
  430. {
  431.     checkdrawer(freqdata->freq->dirbuf);
  432.     refreshdrawergad(freqdata);
  433.     activatefilegad(freqdata);
  434.     clearfiles(freqdata);
  435.     return(get_filenames(freqdata));
  436. }
  437.  
  438. void clearfiles(freqdata)
  439. struct FileReqData *freqdata;
  440. {
  441.     deallocate_entries(freqdata);
  442.     doprops(freqdata);
  443.     fixprop(freqdata);
  444.     displayfiles(freqdata);
  445. }
  446.  
  447. getnew_file(freqdata,work)
  448. struct FileReqData *freqdata;
  449. struct direntry *work;
  450. {
  451.     int i,b;
  452.  
  453.     if (work->type>0) {
  454.         TackOn(freqdata->freq->dirbuf,work->name,256);
  455.         i=getnewdrawer(freqdata);
  456.         if (i!=OKAY && i!=CANCEL && i!=INTERRUPT) i=INTERRUPT;
  457.         return(i);
  458.     }
  459.     if (work->type==0) {
  460.         strcpy(freqdata->freq->dirbuf,work->name);
  461.         i=getnewdrawer(freqdata);
  462.         if (i!=OKAY && i!=CANCEL && i!=INTERRUPT) i=INTERRUPT;
  463.         return(i);
  464.     }
  465.     if ((strcmp(freqdata->freq->filebuf,work->name))==0) b=1;
  466.     else b=0;
  467.     strcpy(freqdata->freq->filebuf,work->name);
  468.     RefreshGList(&freqdata->reqgads[0],freqdata->fr_Window,NULL,1);
  469.     return(b);
  470. }
  471.  
  472. do_idcmp(freqdata,class,code,qual,gadgetid)
  473. struct FileReqData *freqdata;
  474. ULONG class;
  475. USHORT code,qual,gadgetid;
  476. {
  477.     int ret=0,x,y,a,b,ty;
  478.     struct RastPort *rp;
  479.     struct direntry *file;
  480.     LONG sec,mic;
  481.  
  482.     switch (class) {
  483.         case IDCMP_GADGETDOWN:
  484.             switch (gadgetid) {
  485.                 case FILENAMEPOS:
  486.                     doposprop(freqdata);
  487.                     FOREVER {
  488.                         Wait(1<<freqdata->fr_Window->UserPort->mp_SigBit);
  489.                         while (getintuimsg(freqdata->fr_Window,&class,&code,&qual,&gadgetid)) {
  490.                             if (class==GADGETUP) break;
  491.                             if (class==MOUSEMOVE) doposprop(freqdata);
  492.                         }
  493.                         if (class==GADGETUP) break;
  494.                     }
  495.                     break;
  496.                 case FILENAMEUP:
  497.                     repeatscroll(freqdata,-1,0);
  498.                     break;
  499.                 case FILENAMEDOWN:
  500.                     repeatscroll(freqdata,1,0);
  501.                     break;
  502.             }
  503.             activatefilegad(freqdata);
  504.             return(0);
  505.         case IDCMP_GADGETUP:
  506.             switch (gadgetid) {
  507.                 case FILENAMEPOS:
  508.                     doposprop(freqdata);
  509.                     break;
  510.                 case CANCEL:
  511.                     ret=CANCEL;
  512.                     break;
  513.                 case FILENAME:
  514.                     if (qual&IEQUALIFIER_LSHIFT || qual&IEQUALIFIER_RSHIFT) {
  515.                         activatestrgad(freqdata->fr_Window,&freqdata->reqgads[1]);
  516.                         return(-1);
  517.                     }
  518.                     ret=OKAY;
  519.                     break;
  520.                 case OKAY:
  521.                     ret=OKAY;
  522.                     break;
  523.                 case DRAWERNAME:
  524.                     refreshdrawergad(freqdata);
  525.                     if (qual&IEQUALIFIER_LSHIFT || qual&IEQUALIFIER_RSHIFT) {
  526.                         activatefilegad(freqdata);
  527.                         return(-1);
  528.                     }
  529.                     if ((ret=getnewdrawer(freqdata))!=OKAY && ret!=CANCEL && ret!=INTERRUPT)
  530.                         ret=INTERRUPT;
  531.                     return(ret);
  532.                 case PARENT:
  533.                     if (doparent(freqdata)) {
  534.                         if ((ret=getnewdrawer(freqdata))!=OKAY && ret!=CANCEL && ret!=INTERRUPT)
  535.                             ret=INTERRUPT;
  536.                     }
  537.                     break;
  538.                 case DRIVES:
  539.                     activatefilegad(freqdata);
  540.                     if ((ret=listdevices(freqdata))!=OKAY && ret!=CANCEL && ret!=INTERRUPT)
  541.                         ret=INTERRUPT;
  542.                     break;
  543.             }
  544.             activatefilegad(freqdata);
  545.             return(ret);
  546.             break;
  547.         case IDCMP_MOUSEBUTTONS:
  548.             x=freqdata->fr_Window->MouseX; y=freqdata->fr_Window->MouseY;
  549.             if (code==SELECTDOWN &&
  550.                 x>9 && x<freqdata->ww+10 && y>=freqdata->fy && y<freqdata->fy+(freqdata->freq->lines*freqdata->fh)) {
  551.                 a=(y-freqdata->fy)/freqdata->fh;
  552.                 if (file=getfileentry(freqdata,a)) {
  553.                     b=1; ty=freqdata->fy+(a*freqdata->fh);
  554.                     rp=freqdata->fr_Window->RPort;
  555.                     SetDrMd(rp,COMPLEMENT);
  556.                     RectFill(rp,10,ty,freqdata->ww+9,ty+(freqdata->fh-1));
  557.                     if (freqdata->flags&DFRF_MULTI && file->type<0) {
  558.                         file->select=1-file->select;
  559.                         b=1;
  560.                     }
  561.                     else {
  562.                         freqdata->fr_Window->Flags|=WFLG_REPORTMOUSE;
  563.                         FOREVER {
  564.                             Wait(1<<freqdata->fr_Window->UserPort->mp_SigBit);
  565.                             while (getintuimsg(freqdata->fr_Window,&class,&code,&qual,&gadgetid)) {
  566.                                 if (class==MOUSEMOVE) {
  567.                                     x=freqdata->fr_Window->MouseX; y=freqdata->fr_Window->MouseY;
  568.                                     if (x<10 || x>freqdata->ww+9 || y<ty || y>=ty+freqdata->fh) {
  569.                                         if (b) {
  570.                                             b=0;
  571.                                             RectFill(rp,10,ty,freqdata->ww+9,ty+(freqdata->fh-1));
  572.                                         }
  573.                                     }
  574.                                     else if (!b) {
  575.                                         b=1;
  576.                                         RectFill(rp,10,ty,freqdata->ww+9,ty+(freqdata->fh-1));
  577.                                     }
  578.                                 }
  579.                                 else if (class==MOUSEBUTTONS && code==SELECTUP) break;
  580.                             }
  581.                             if (class==MOUSEBUTTONS && code==SELECTUP) break;
  582.                         }
  583.                         freqdata->fr_Window->Flags&=~WFLG_REPORTMOUSE;
  584.                     }
  585.                     if (b) {
  586.                         if (!(freqdata->flags&DFRF_MULTI))
  587.                             RectFill(rp,10,ty,freqdata->ww+9,ty+(freqdata->fh-1));
  588.                         SetDrMd(rp,JAM2);
  589.                         CurrentTime((ULONG *)&sec,(ULONG *)&mic);
  590.                         if ((ret=getnew_file(freqdata,file))==1 &&
  591.                             DoubleClick(freqdata->prevsec,freqdata->prevmic,sec,mic)) ret=OKAY;
  592.                         else if (ret!=OKAY && ret!=CANCEL && ret!=INTERRUPT) {
  593.                             freqdata->prevsec=sec; freqdata->prevmic=mic;
  594.                             ret=0;
  595.                         }
  596.                     }
  597.                     else SetDrMd(rp,JAM2);
  598.                 }
  599.             }
  600.             else if (code==MENUDOWN &&
  601.                 x>9 && x<freqdata->ww+10 && y>28 && y<37+(freqdata->freq->lines*freqdata->fh)) {
  602.                 a=((freqdata->freq->lines*freqdata->fh)/2)+30;
  603.                 if (y<(a-freqdata->fh)) b=-1;
  604.                 else if (y>(a+freqdata->fh)) b=1;
  605.                 else b=0;
  606.                 repeatscroll(freqdata,b,1);
  607.             }
  608.             activatefilegad(freqdata);
  609.             return(ret);
  610.             break;
  611.         default:
  612.             activatefilegad(freqdata);
  613.             break;
  614.     }
  615.     return(0);
  616. }
  617.  
  618. listdevices(freqdata)
  619. struct FileReqData *freqdata;
  620. {
  621.     char devname[32];
  622.     struct DeviceList *devlist;
  623.     struct RootNode *rootnode;
  624.     struct DosInfo *dosinfo;
  625.     ULONG class;
  626.     USHORT code,qual,gadgetid;
  627.     int ret;
  628.  
  629.     clearfiles(freqdata);
  630.     rootnode=(struct RootNode *) DOSBase->dl_Root;
  631.     dosinfo=(struct DosInfo *) BADDR(rootnode->rn_Info);
  632.     devlist=(struct DeviceList *) BADDR(dosinfo->di_DevInfo);
  633.  
  634.     while (devlist) {
  635.         while (getintuimsg(freqdata->fr_Window,&class,&code,&qual,&gadgetid)) {
  636.             ret=gettingdirmsg(freqdata,class,code,qual,gadgetid);
  637.             if (ret==OKAY || ret==CANCEL || ret==INTERRUPT) return(ret);
  638.         }
  639.         if (devlist->dl_Type!=DLT_DEVICE || devlist->dl_Task) {
  640.             BtoCStr(devlist->dl_Name,devname,32);
  641.             LStrCat(devname,":");
  642.             addfileentry(freqdata,devname,0,devlist->dl_Type);
  643.         }
  644.         devlist=(struct DeviceList *) BADDR(devlist->dl_Next);
  645.     }
  646.     freqdata->oldfileoffset=-1;
  647.     fixprop(freqdata);
  648.     doposprop(freqdata);
  649.     return(-1);
  650. }
  651.  
  652. char *devtypes[5]={"  <DEV>","  <ASN>","  <VOL>","  <DFR>","  <NBD>"};
  653.  
  654. addfileentry(freqdata,name,type,size)
  655. struct FileReqData *freqdata;
  656. char *name;
  657. int type,size;
  658. {
  659.     struct direntry *add,*afterdir=NULL,*work,*new;
  660.     int adir=0;
  661.  
  662.     if (freqdata->firstfile) {
  663.         if (type<0) {
  664.             if (freqdata->firstdir) add=freqdata->firstdir;
  665.             else {
  666.                 add=freqdata->firstfile;
  667.                 while (add && add->type>0) add=add->next;
  668.             }
  669.         }
  670.         else add=freqdata->firstfile;
  671.         while (add) {
  672.             if (LStrCmpI(name,add->name)<=0 ||
  673.                 (type>0 && add==freqdata->firstdir)) {
  674.                 if (add->last) afterdir=add->last;
  675.                 else adir=1;
  676.                 break;
  677.             }
  678.             add=add->next;
  679.         }
  680.     }
  681.  
  682.     if (!(new=(struct direntry *)
  683.         DoAllocRemember(&freqdata->filekey,sizeof(struct direntry),MEMF_CLEAR)))
  684.         return(0);
  685.  
  686.     if (afterdir) {
  687.         work=afterdir;
  688.         add=afterdir->next;
  689.         work->next=new;
  690.         new->last=work;
  691.         work=new;
  692.         work->next=add;
  693.         add->last=work;
  694.     }
  695.     else if (adir==1) {
  696.         add=freqdata->firstfile;
  697.         work=new;
  698.         work->next=add;
  699.         add->last=work;
  700.         freqdata->firstfile=work;
  701.     }
  702.     else {
  703.         if (freqdata->firstfile) {
  704.             work=freqdata->firstfile;
  705.             while (work->next) work=work->next;
  706.             work->next=new;
  707.             new->last=work;
  708.             work=new;
  709.         }
  710.         else {
  711.             work=new;
  712.             freqdata->firstfile=work;
  713.         }
  714.     }
  715.     strcpy(work->name,name);
  716.     if (type==0) strcpy(work->size,devtypes[size]);
  717.     else if (type<0) {
  718.         LSprintf(work->size,"%7ld",size);
  719.         if ((work->last && work->last->type>0) || (!work->last && type<0))
  720.             freqdata->firstdir=work;
  721.     }
  722.     else strcpy(work->size,"    Dir");
  723.     work->type=type;
  724.     ++freqdata->fileentries;
  725. }
  726.  
  727. repeatscroll(freqdata,dir,menu)
  728. struct FileReqData *freqdata;
  729. int dir,menu;
  730. {
  731.     ULONG class;
  732.     USHORT code,gadgetid;
  733.     int x,y,m;
  734.  
  735.     if ((dir==-1 && freqdata->fileoffset==0) ||
  736.         (dir==1 && freqdata->fileoffset>=freqdata->fileentries-freqdata->freq->lines))
  737.         return(0);
  738.     freqdata->fileoffset+=dir;
  739.     displayfiles(freqdata);
  740.     doprops(freqdata);
  741.     if (menu) m=((freqdata->freq->lines*freqdata->fh)/2)+30;
  742.     Delay(5);
  743.     FOREVER {
  744.         if (getintuimsg(freqdata->fr_Window,&class,&code,NULL,&gadgetid) &&
  745.             (class==GADGETUP || (class==MOUSEBUTTONS && code==SELECTUP)) ||
  746.             (menu && class==MOUSEBUTTONS && code==MENUUP)) break;
  747.         if (menu) {
  748.             x=freqdata->fr_Window->MouseX; y=freqdata->fr_Window->MouseY;
  749.             if (x>9 && x<freqdata->ww+10) {
  750.                 if (y<(m-freqdata->fh)) dir=-1;
  751.                 else if (y>(m+freqdata->fh)) dir=1;
  752.                 else dir=0;
  753.             }
  754.         }
  755.         if ((dir==-1 && freqdata->fileoffset==0) ||
  756.             (dir==1 && freqdata->fileoffset>=freqdata->fileentries-freqdata->freq->lines))
  757.             break;
  758.         freqdata->fileoffset+=dir;
  759.         displayfiles(freqdata);
  760.         doprops(freqdata);
  761.     }
  762. }
  763.  
  764. void doprops(freqdata)
  765. struct FileReqData *freqdata;
  766. {
  767.     DoFixSliderPot(freqdata->fr_Window,&freqdata->reqgads[8],freqdata->fileoffset,freqdata->fileentries,freqdata->freq->lines,1);
  768. }
  769.  
  770. void fixprop(freqdata)
  771. struct FileReqData *freqdata;
  772. {
  773.     DoFixSliderBody(freqdata->fr_Window,&freqdata->reqgads[8],freqdata->fileentries,freqdata->freq->lines,1);
  774. }
  775.  
  776. doparent(freqdata)
  777. struct FileReqData *freqdata;
  778. {
  779.     int i,b;
  780.  
  781.     if ((i=strlen(freqdata->freq->dirbuf))<2) return(0);
  782.     --i;
  783.     if (freqdata->freq->dirbuf[i]==':') return(0);
  784.     if (freqdata->freq->dirbuf[i]=='/') --i;
  785.     for (b=i;b>-1;b--) {
  786.         if (freqdata->freq->dirbuf[b]=='/') break;
  787.         if (freqdata->freq->dirbuf[b]==':') { ++b; break; }
  788.     }
  789.     if (b<0) b=0;
  790.     freqdata->freq->dirbuf[b]=0;
  791.     RefreshGList(&freqdata->reqgads[1],freqdata->fr_Window,NULL,1);
  792.     return(1);
  793. }
  794.  
  795. void checkdrawer(buf)
  796. char *buf;
  797. {
  798.     int i;
  799.  
  800.     if ((i=strlen(buf))>1) {
  801.         --i;
  802.         if (buf[i]!='/' && buf[i]!=':') LStrCat(buf,"/");
  803.     }
  804. }
  805.  
  806. void refreshdrawergad(freqdata)
  807. struct FileReqData *freqdata;
  808. {
  809.     freqdata->drawernamesinfo.BufferPos=strlen(freqdata->freq->dirbuf);
  810.     RefreshGList(&freqdata->reqgads[1],freqdata->fr_Window,NULL,1);
  811. }
  812.  
  813. void activatestrgad(win,gad)
  814. struct Window *win;
  815. struct Gadget *gad;
  816. {
  817.     struct StringInfo *sinfo;
  818.  
  819.     sinfo=(struct StringInfo *)gad->SpecialInfo;
  820.     sinfo->BufferPos=strlen((char *)sinfo->Buffer);
  821.     RefreshGList(gad,win,NULL,1);
  822.     ActivateGadget(gad,win,NULL);
  823. }
  824.  
  825. initrequester(freqdata)
  826. struct FileReqData *freqdata;
  827. {
  828.     int a,b;
  829.     struct DOpusFileReq *freq;
  830.     struct RastPort *rp;
  831.     struct Screen *screen;
  832.     struct TextFont *font;
  833.  
  834.     freq=freqdata->freq;
  835.     freq->filearraykey=NULL; freq->filearray=NULL;
  836.     freqdata->flags=freq->flags;
  837.     if (freqdata->flags&DFRF_DIRREQ) freqdata->flags&=~DFRF_MULTI;
  838.  
  839.     if (IntuitionBase->LibNode.lib_Version>35) freqdata->version2=1;
  840.     screen=(freq->window)?freq->window->WScreen:IntuitionBase->ActiveScreen;
  841.  
  842.     freqdata->sfh=screen->RastPort.Font->tf_YSize;
  843.     freqdata->sfw=screen->RastPort.Font->tf_XSize;
  844.     if (freqdata->sfh<8) freqdata->sfh=8;
  845.     if (freqdata->sfw<6) freqdata->sfw=6;
  846.  
  847.     if (screen->RastPort.Font->tf_Flags&FPF_PROPORTIONAL)
  848.         font=GfxBase->DefaultFont;
  849.     else font=screen->RastPort.Font;
  850.  
  851.     freqdata->fh=font->tf_YSize; freqdata->fw=font->tf_XSize;
  852.     freqdata->fb=font->tf_Baseline;
  853.  
  854.     CopyMem((char *)&defaultprop,(char *)&freqdata->filenameprop,sizeof(struct PropInfo));
  855.     freqdata->filenamesinfo.Buffer=(STRPTR)freq->filebuf;
  856.     freqdata->filenamesinfo.MaxChars=FILEBUF_SIZE-1;
  857.     freqdata->drawernamesinfo.Buffer=(STRPTR)freq->dirbuf;
  858.     freqdata->drawernamesinfo.MaxChars=256-FILEBUF_SIZE/*236*/;
  859.  
  860.     if (freq->lines<5) freq->lines=5;
  861.     else if (freq->lines>((screen->Height-(freqdata->sfh*5)+35)/freqdata->fh))
  862.         freq->lines=(screen->Height-(freqdata->sfh*5)+35)/freqdata->fh;
  863.  
  864.     if (!(freqdata->filetype=AllocMem(sizeof(int)*freq->lines,MEMF_CLEAR)))
  865.         return(0);
  866.  
  867.     CopyMem((char *)&defaultgadgets,(char *)&freqdata->reqgads,sizeof(struct Gadget)*9);
  868.     CopyMem((char *)&defaulttext,(char *)&freqdata->reqtext,sizeof(struct IntuiText)*6);
  869.     CopyMem((char *)&defaultimage,(char *)&freqdata->filenameimage,sizeof(struct Image));
  870.     freqdata->reqgads[0].SpecialInfo=(APTR)&freqdata->filenamesinfo;
  871.     freqdata->reqgads[1].SpecialInfo=(APTR)&freqdata->drawernamesinfo;
  872.     freqdata->reqgads[8].GadgetRender=(APTR)&freqdata->filenameimage;
  873.     freqdata->reqgads[8].SpecialInfo=(APTR)&freqdata->filenameprop;
  874.     for (a=0;a<8;a++) freqdata->reqgads[a].NextGadget=&freqdata->reqgads[a+1];
  875.     for (a=0;a<4;a++) freqdata->reqgads[a].GadgetText=&freqdata->reqtext[a];
  876.     for (a=6;a<8;a++) freqdata->reqgads[a].GadgetText=&freqdata->reqtext[a-2];
  877.     CopyMem((char *)&defaultwindow,(char *)&freqdata->reqwin,sizeof(struct NewWindow));
  878.     freqdata->reqwin.Height=(freq->lines*freqdata->fh)+(freqdata->sfh*5)+31+((freqdata->flags&DFRF_DIRREQ)?0:4);
  879.     if (freqdata->reqwin.Height>screen->Height) {
  880.         freq->lines=(screen->Height-((freqdata->sfh*5)+35))/freqdata->fh;
  881.         freqdata->reqwin.Height=(freq->lines*freqdata->fh)+(freqdata->sfh*5)+35;
  882.     }
  883.     if (freqdata->flags&DFRF_DIRREQ) freqdata->reqwin.Height-=freqdata->sfh+2;
  884.     freqdata->reqwin.Width=(freqdata->fw*35)+36;
  885.     if (freqdata->reqwin.Width>screen->Width) {
  886.         a=(screen->Width-36)/freqdata->fw;
  887.         freqdata->width=a;
  888.         freqdata->reqwin.Width=(freqdata->fw*a)+36;
  889.     }
  890.     else freqdata->width=35;
  891.     freqdata->ww=freqdata->width*freqdata->fw;
  892.  
  893.     freqdata->reqwin.Screen=screen;
  894.     if (freq->x==-2) freqdata->reqwin.LeftEdge=(screen->Width-freqdata->reqwin.Width)/2;
  895.     else if (freq->x<0) freqdata->reqwin.LeftEdge=15;
  896.     else freqdata->reqwin.LeftEdge=freq->x;
  897.     if (freq->y==-2) freqdata->reqwin.TopEdge=(screen->Height-freqdata->reqwin.Height)/2;
  898.     else if (freq->y<0) freqdata->reqwin.TopEdge=25;
  899.     else freqdata->reqwin.TopEdge=freq->y;
  900.     if (freqdata->reqwin.LeftEdge+freqdata->reqwin.Width>screen->Width)
  901.         freqdata->reqwin.LeftEdge=screen->Width-freqdata->reqwin.Width;
  902.     if (freqdata->reqwin.TopEdge+freqdata->reqwin.Height>screen->Height)
  903.         freqdata->reqwin.TopEdge=screen->Height-freqdata->reqwin.Height;
  904.     if (freq->title) freqdata->reqwin.Title=(STRPTR)freq->title;
  905.     else freqdata->reqwin.Title=(STRPTR)"File request";
  906.     if (freqdata->flags&DFRF_SAVE && !freqdata->version2) freqdata->reqwin.BlockPen=2;
  907.  
  908.     if (!(freqdata->finfo=AllocMem(sizeof(struct FileInfoBlock),MEMF_CLEAR)))
  909.         return(0);
  910.  
  911.     freqdata->oldfileoffset=-1;
  912.  
  913.     if (!(freqdata->fr_Window=OpenWindow(&freqdata->reqwin))) return(0);
  914.     rp=freqdata->fr_Window->RPort;
  915.     SetFont(rp,font);
  916.     SetDrMd(rp,JAM2);
  917.     freqdata->sfy=freqdata->fr_Window->BorderTop+2;
  918.     freqdata->fy=freqdata->sfy+freqdata->sfh+7;
  919.  
  920.     a=freq->lines*freqdata->fh;
  921.     freqdata->reqgads[1].TopEdge=freqdata->fy+a+5;
  922.     if (!(freqdata->flags&DFRF_DIRREQ))
  923.         freqdata->reqgads[0].TopEdge=freqdata->reqgads[1].TopEdge+freqdata->sfh+6;
  924.     freqdata->reqgads[2].TopEdge=
  925.         freqdata->reqgads[(freqdata->flags&DFRF_DIRREQ?1:0)].TopEdge+freqdata->sfh+4;
  926.     freqdata->reqgads[3].TopEdge=freqdata->reqgads[2].TopEdge;
  927.     freqdata->reqgads[4].TopEdge=freqdata->fy+a-15;
  928.     freqdata->reqgads[5].TopEdge=freqdata->fy+a-7;
  929.     freqdata->reqgads[6].TopEdge=freqdata->reqgads[7].TopEdge=freqdata->sfy;
  930.     freqdata->reqgads[8].TopEdge=freqdata->fy+1;
  931.     freqdata->reqgads[0].LeftEdge=freqdata->reqgads[1].LeftEdge=(freqdata->sfw*6)+16;
  932.     freqdata->reqgads[3].LeftEdge=freqdata->reqgads[7].LeftEdge=freqdata->ww-104;
  933.     freqdata->reqgads[4].LeftEdge=freqdata->reqgads[5].LeftEdge=freqdata->ww+12;
  934.     freqdata->reqgads[8].LeftEdge=freqdata->ww+16;
  935.     freqdata->reqgads[0].Width=freqdata->reqgads[1].Width=(freqdata->ww+24)-freqdata->reqgads[0].LeftEdge;
  936.     if ((freqdata->sfw*6)>132) {
  937.         freqdata->reqgads[2].Width=freqdata->reqgads[3].Width=
  938.             freqdata->reqgads[6].Width=freqdata->reqgads[7].Width=
  939.             freqdata->sfw*7;
  940.         freqdata->reqgads[3].LeftEdge-=((freqdata->sfw*7)-132);
  941.         freqdata->reqgads[7].LeftEdge=freqdata->reqgads[3].LeftEdge;
  942.     }
  943.     freqdata->reqgads[0].Height=freqdata->reqgads[1].Height=freqdata->sfh;
  944.     freqdata->reqgads[2].Height=freqdata->reqgads[3].Height=
  945.         freqdata->reqgads[6].Height=freqdata->reqgads[7].Height=freqdata->sfh+4;
  946.     freqdata->reqgads[8].Height=a-18;
  947.  
  948.     for (b=2;b<8;b++)
  949.         Do3DBox(rp,freqdata->reqgads[b].LeftEdge+2,freqdata->reqgads[b].TopEdge+1,
  950.             freqdata->reqgads[b].Width-4,freqdata->reqgads[b].Height-2,2,1);
  951.     if (!(freqdata->flags&DFRF_DIRREQ))
  952.         Do3DStringBox(rp,freqdata->reqgads[0].LeftEdge,freqdata->reqgads[0].TopEdge,freqdata->reqgads[0].Width,freqdata->sfh,2,1);
  953.     Do3DStringBox(rp,freqdata->reqgads[1].LeftEdge,freqdata->reqgads[1].TopEdge,freqdata->reqgads[1].Width,freqdata->sfh,2,1);
  954.     for (b=4;b<6;b++) DoArrow(rp,freqdata->ww+14,freqdata->reqgads[b].TopEdge+1,12,6,1,0,b-4);
  955.     Do3DBox(rp,10,freqdata->fy,freqdata->ww,a,2,1);
  956.     Do3DBox(rp,freqdata->ww+14,freqdata->fy,12,a-16,2,1);
  957.  
  958.     freqdata->reqtext[0].LeftEdge=freqdata->reqtext[1].LeftEdge=-(freqdata->reqgads[0].LeftEdge-10);
  959.     for (b=2;b<6;b++) freqdata->reqtext[b].LeftEdge=(freqdata->reqgads[2].Width-(freqdata->sfw*6))/2;
  960.  
  961.     AddGList(freqdata->fr_Window,&freqdata->reqgads[(freqdata->flags&DFRF_DIRREQ)?1:0],-1,-1,NULL);
  962.     RefreshGList(&freqdata->reqgads[(freqdata->flags&DFRF_DIRREQ)?1:0],freqdata->fr_Window,NULL,-1);
  963.     activatefilegad(freqdata);
  964.     return(1);
  965. }
  966.  
  967. getintuimsg(win,class,code,qual,gadgetid)
  968. struct Window *win;
  969. ULONG *class;
  970. USHORT *code,*qual,*gadgetid;
  971. {
  972.     struct IntuiMessage *msg;
  973.  
  974.     if (msg=(struct IntuiMessage *)GetMsg(win->UserPort)) {
  975.         *class=msg->Class; *code=msg->Code;
  976.         if (qual) *qual=msg->Qualifier;
  977.         if (msg->Class==GADGETDOWN || msg->Class==GADGETUP)
  978.             *gadgetid=((struct Gadget *)msg->IAddress)->GadgetID;
  979.         ReplyMsg((struct Message *)msg);
  980.         return(1);
  981.     }
  982.     return(0);
  983. }
  984.  
  985. gettingdirmsg(freqdata,class,code,qual,gadgetid)
  986. struct FileReqData *freqdata;
  987. ULONG class;
  988. USHORT code,qual,gadgetid;
  989. {
  990.     int ret;
  991.  
  992.     if ((ret=do_idcmp(freqdata,class,code,qual,gadgetid))!=-1) {
  993.         freqdata->oldfileoffset=-1;
  994.         return(ret);
  995.     }
  996.     return(0);
  997. }
  998.  
  999. void activatefilegad(freqdata)
  1000. struct FileReqData *freqdata;
  1001. {
  1002.     activatestrgad(freqdata->fr_Window,
  1003.         &freqdata->reqgads[(freqdata->flags&DFRF_DIRREQ)?1:0]);
  1004. }
  1005.  
  1006. struct direntry *getfileentry(freqdata,which)
  1007. struct FileReqData *freqdata;
  1008. int which;
  1009. {
  1010.     int i,b;
  1011.     struct direntry *work;
  1012.  
  1013.     i=freqdata->fileoffset+which;
  1014.     if (!(work=freqdata->firstfile)) return(0);
  1015.     for (b=0;b<i;b++) if (!(work=work->next)) return(0);
  1016.     return(work);
  1017. }
  1018.  
  1019. void freemulti(freq)
  1020. struct DOpusFileReq *freq;
  1021. {
  1022.     if (freq->flags&DFRF_MULTI) DoFreeRemember(&freq->filearraykey);
  1023.     freq->filearray=NULL;
  1024. }
  1025.